﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PoJun.Tools.DB.RDBMS
{
    /// <summary>
    /// SqlServerDB基类
    /// </summary>
    public class SqlServerDBBase
    {
        #region 初始化

        /// <summary>
        /// 获取配置文件中的连接字符串 
        /// </summary>
        protected static readonly string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["GSqlServer"].ConnectionString;

        /// <summary>
        /// 数据库超时时间（默认3分钟如果设置为0代表不限制时间慎用）
        /// </summary>
        protected static readonly int CommandTimeout = 720;

        #endregion

        #region 给SqlCommand赋值

        /// <summary>
        /// 给SqlCommand赋值
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <param name="Type">类型</param>
        /// <returns></returns>
        protected SqlCommand GetCommand(string sql, CommandType type)
        {
            //设置Command对象
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = sql;
            cmd.CommandType = type;

            return cmd;
        }

        /// <summary>
        /// 给SqlCommand赋值
        /// </summary>
        /// <param name="name">存储过程名称</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns></returns>
        protected SqlCommand GetCommand(string name, CommandType type, params object[] param)
        {
            //设置Command对象
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = name;
            cmd.CommandType = type;

            SqlParameter[] sp = new SqlParameter[] { };
            sp = (SqlParameter[])param;

            //添加参数
            if (sp.Length > 0)
            {
                cmd.Parameters.AddRange(sp);
            }
            return cmd;
        }

        #endregion
    }

    /// <summary>
    /// SqlServerDBHelper - 同步仓储
    /// </summary>
    [Obsolete("尚未完成，请勿使用")]
    public class SqlServerDBHelper : SqlServerDBBase, IDBHelper
    {
        #region 执行增（INSERT）删（DELETE）改（UPDATE）语句。

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns></returns>
        public int ExecuteCommand(string sql)
        {
            SqlCommand cmd = null;
            int flag = 0;
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                try
                {
                    //设置Command对象
                    cmd = GetCommand(sql, CommandType.Text);
                    cmd.CommandTimeout = CommandTimeout;//设置数据库超时时间(3分钟),如果设置为0代表不限制时间慎用
                    cmd.Connection = conn;
                    //打开连接
                    conn.Open();
                    //开始事物
                    cmd.Transaction = conn.BeginTransaction();
                    //执行命令操作
                    flag = cmd.ExecuteNonQuery();
                    //提交事务
                    cmd.Transaction.Commit();
                }
                catch (Exception e)
                {
                    if (cmd.Transaction != null)
                    {
                        //回滚事物
                        cmd.Transaction.Rollback();
                    }
                }
                finally
                {
                    //关闭数据库链接
                    conn.Close();
                    //释放资源
                    if (cmd.Transaction != null)
                    {
                        //回滚事物
                        cmd.Transaction.Dispose();
                    }
                    cmd.Parameters.Clear();
                    cmd.Dispose();
                }

                return flag;
            }
        }

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        public int ExecuteCommand(string name, CommandType Type, params object[] param)
        {
            SqlCommand cmd = null;
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                //打开连接
                conn.Open();
                //执行命令操作
                int flag = 0;
                try
                {
                    //设置Command对象
                    cmd = GetCommand(name, Type, param);
                    cmd.CommandTimeout = CommandTimeout;//设置数据库超时时间(3分钟),如果设置为0代表不限制时间慎用
                    cmd.Connection = conn;
                    cmd.Transaction = conn.BeginTransaction();
                    flag = cmd.ExecuteNonQuery();
                    cmd.Transaction.Commit();
                }
                catch (Exception e)
                {
                    if (cmd.Transaction != null)
                    {
                        cmd.Transaction.Rollback();
                    }
                    throw e;
                }
                finally
                {
                    //关闭数据库链接
                    conn.Close();
                    //释放资源
                    if (cmd.Transaction != null)
                    {
                        //回滚事物
                        cmd.Transaction.Dispose();
                    }
                    cmd.Parameters.Clear();
                    cmd.Dispose();
                }

                return flag;
            }
        }

        #endregion

        #region 执行查询（SELECT）语句，第一行第一列的值

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        public string GetScalar(string sql)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                //设置Command对象
                using (SqlCommand cmd = GetCommand(sql, CommandType.Text))
                {
                    cmd.Connection = conn;
                    //打开连接
                    conn.Open();
                    //执行命令操作
                    string flag = Convert.ToString(cmd.ExecuteScalar());
                    //关闭数据库链接
                    conn.Close();
                    return flag;
                }
            }
        }

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        public string GetScalar(string name, CommandType Type, params object[] param)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                //设置Command对象
                using (SqlCommand cmd = GetCommand(name, Type, param))
                {
                    cmd.Connection = conn;
                    //打开连接
                    cmd.Connection.Open();
                    string flag = "-1";
                    //执行命令操作
                    flag = Convert.ToString(cmd.ExecuteScalar());
                    //关闭数据库链接
                    cmd.Connection.Close();
                    return flag;
                }
            }
        }

        #endregion

        #region 执行查询（SELECT）语句，获取填充后数据集

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>DataSet</returns>
        public DataSet GetDataSet(string sql)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                //设置Command对象
                using (SqlCommand cmd = GetCommand(sql, CommandType.Text))
                {
                    cmd.Connection = conn;
                    //打开连接
                    cmd.Connection.Open();
                    SqlDataAdapter sda = new SqlDataAdapter();
                    sda.SelectCommand = cmd;
                    DataSet ds = new DataSet();
                    sda.Fill(ds, "Table");
                    //关闭数据库链接
                    cmd.Connection.Close();
                    return ds;
                }                   
            }
        }

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>DataSet</returns>
        public DataSet GetDataSet(string name, CommandType Type, params object[] param)
        {
            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                //设置Command对象
                SqlCommand cmd = GetCommand(name, Type, param);
                cmd.Connection = conn;
                SqlDataAdapter sda = new SqlDataAdapter();
                sda.SelectCommand = cmd;
                DataSet ds = new DataSet();

                sda.Fill(ds, "Table");
                //释放资源
                cmd.Parameters.Clear();
                cmd.Dispose();
                cmd = null;
                return ds;
            }
        }

        #endregion
    }

    //public class SqlServerDBHelperAsync : SqlServerDBBase, IDBHelper
    //{
    //    public async Task<int> ExecuteCommand(string sql)
    //    {
    //        SqlCommand cmd = null;
    //        int flag = 0;
    //    }
    //}
}
